package com.pangolin.pangolinim.utils;

import android.os.Bundle;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * @ BundleUtil类
 * @ TODO：该类用于解析UI和Service之间广播通讯的固定格式（可设置是否加密）
 * @ 广播数据包格式为bundle:{ "type":[int],"data":[String],"msg":[String] }
 * @ 其中data为json字符串（可加密）
 */
public class BundleUtil {
    private int type;
    private Map<String , Object> resMap;
    private String msg;

    /**
     * TODO: 构造函数（用于解封bundle包，并将内容保存在成员变量中）
     * @param bundle 要解析的bundle
     */
    public BundleUtil(Bundle bundle){
       type = bundle.getInt("type");
       msg = bundle.getString("msg") == null ? null : bundle.getString("msg");
       try{
           resMap = bundle.getString("data") == null ? null : getMapForJson(bundle.getString("data"));
       }catch (JSONException ex){
           resMap = null;
       }
    }

    /**
     * TODO: 构造函数（用于无data的budle包封装）
     * @param t 消息type
     * @param s 消息msg
     */
    public BundleUtil(int t ,  String s){
        type = t;
        msg = s;
    }

    /**
     * TODO: 构造函数（用于将map作为data封装为bundle包）
     * @param t 消息type
     * @param m 消息data
     * @param s 消息msg
     */
    public BundleUtil(int t , Map<String , Object> m , String s){
        type = t;
        resMap = m;
        msg = s;
    }

    /**
     * TODO：获取封装好的bundle包
     * @return 封装好的bundle包
     */
    public Bundle getBundle(){
        Bundle bundle = new Bundle();
        bundle.putInt("type" , type);
        if(resMap != null ){
            JSONObject jsonObject = new JSONObject(resMap);
            bundle.putString("data" , jsonObject.toString());
        }
        if (msg != null){
            bundle.putString("msg" , msg);
        }
        return bundle;
    }

    /**
     * TODO：获取解包的bundle.type
     * @return bendle.type
     */
    public int getType(){
        return type;
    }

    /**
     * TODO:获取解开包的bundle.data
     * @return bundle.data（map格式）
     */
    public Map<String , Object> getData(){
        return resMap;
    }

    /**
     * TODO：获取解包的bundle.msg
     * @return bundle.msg
     */
    public String getMsg(){
        return msg;
    }

    /**
     * TODO：内部函数，用于Json 转成 Map<>
     * @param jsonStr
     * @return
     */
    public static Map<String, Object> getMapForJson(String jsonStr) throws JSONException{
        Map<String, Object> valueMap = new HashMap<String, Object>();
        JSONObject jsonObject = new JSONObject(jsonStr);
        Iterator<String> keyIter= jsonObject.keys();

        while (keyIter.hasNext()) {
            String key = keyIter.next();
            Object value = jsonObject.get(key);
            valueMap.put(key, value);
        }
        return valueMap;
    }
}
